﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Model
{
    /// <summary>
    /// Класс "Банковский счёт"
    /// </summary>
    [Serializable]
    public class Account:ModelBase
    {
        #region Private
        protected static int Count = 0; // Счётчик счетов
        protected string _owner;                // клиент к которому относится счет
        protected double _balance;              // Баланс счёта (сумма денег на счёте)
        protected string _id;                   // ID счёта (номер счёта)
        protected DateTime _startDate;  // Дата открытия счёта
        protected DateTime _expireDate; // Дата закрытия счёта

        #endregion

        /// <summary>
        /// свойство "Дата создания счёта"
        /// </summary>
        public DateTime StartDate
        {
            get
            {
                return _startDate;
            }
        }

        /// <summary>
        /// Владелец счёта
        /// </summary>
        public string OwnerClientId
        {
            get
            {
                return this._owner;
            }
        }

        /// <summary>
        /// Дата закрытия счёта
        /// </summary>
        public DateTime ExpireDate
        {
            get
            {
                return _expireDate;
            }
        }

        /// <summary>
        /// Изменение баланса счёта
        /// </summary>
        public double Balance
        {
            get { return this._balance; }
            private set
            {
                // Если значение отрицательное - выходим
                if (value < 0)
                    throw new ArgumentException("Изменить баланс счёта " + this.Id + " не удалось");
                _balance = value;
            }
        }
        /// <summary>
        /// Положить деньги на счёт
        /// </summary>
        /// <param name="amount">Сумма</param>
        /// <returns>bool</returns>
        public void MoneyInc(double amount)
        {
            this.Balance += amount;
        }

        /// <summary>
        /// Снять деньги со счёта
        /// </summary>
        /// <param name="amount">Сумма</param>
        /// <returns></returns>
        public void MoneyDec(double amount)
        {
            // Если сумма денег <= баланса
            if (amount <= this._balance)
            {
                this.Balance -= amount;
            }
            else
                throw new Exception("Невозможно снять деньги");
 
        }

        ///// <summary>
        ///// Вывести информацию о счёте
        ///// </summary>
        ///// <returns></returns>
        //public override string ToString()
        //{
            //StringBuilder message = new StringBuilder();
           
            //message.Append("№ счёта: " + this.Id + "\n");

            //// Если клиент - физлицо
            //if (OwnerClient.Information.clType == ClientType.Phisical)
            //{
            //    message.Append("Владелец счёта: " + OwnerClient.Information.FistName + " " + OwnerClient.Information.LastName + "\n");
            //    message.Append("Дата открытия счёта: " + this.StartDate + "\n");
            //    message.Append("Дата закрытия счёта: " + this.ExpireDate + "\n");
            //    message.Append("Дата рождения клиента: " + OwnerClient.Information.dob + "\n");
            //    message.Append("Адрес клиента: " + OwnerClient.Information.Address + "\n");
            //    message.Append("Серия и номер паспорта: " + OwnerClient.Information.PassportNumber + "\n");
            //}
            //else // Если клиент - юрлицо
            //{
            //    message.Append("Владелец счёта: " + OwnerClient.Information.OrgName + "\n");
            //    message.Append("Дата открытия счёта: " + this.StartDate + "\n");
            //    message.Append("Дата закрытия счёта: " + this.ExpireDate + "\n");
            //    message.Append("Адрес юр.лица: " + OwnerClient.Information.Address + "\n");
            //}
            //message.Append("Текущий баланс на счёте: " + this.Balance + "\n");        
            //return message.ToString();
            ////return base.ToString();
        //}

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="bank">Банк-владелец</param>
        /// <param name="client">Клиент-владелец</param>
        /// <param name="DateExpire">Дата закрытия счёта</param>
        /// <param name="initBalance">Сумма денег на счёте</param>
        public Account(string clientId, DateTime DateExpire, double initBalance)
        {
            Balance = initBalance;
            _owner = clientId;
            _startDate = DateTime.Now;
            _expireDate = DateExpire;
        }
    }
}
